/*
 * pid_control.h
 *
 *  Created on: Nov 20, 2024
 *      Author: Vinson
 */

#ifndef SRC_MOTOR_PID_CONTROL_H_
#define SRC_MOTOR_PID_CONTROL_H_

#include "stdint.h"

typedef struct _pid_control {

	float p; 				/* 比例增益(P环增益) */
    float i;    			/* 积分增益(I环增益) */
    float d;    			/* 微分增益(D环增益) */

	float voltage_ramp;  	/* PID 控制器 输出变化的最大幅值[-voltage_ramp, voltage_ramp] */
    float voltage_limit;	/* PID 控制器的输出电压限制限幅 */

	float error_prev; 		/* 最后的跟踪误差值 */
    float voltage_prev;  	/* 最后一个 pid 输出值 */
    float integral_prev; 	/* 最后一个积分分量值 */
    uint64_t ts_prev; 		/* 上次执行时间戳 */

	void (*init)(struct _pid_control *pid);
	void (*set)(struct _pid_control *pid, float p, float i, float d, float ramp, float limit);
	float (*pid_control)(struct _pid_control *pid, float input);
} pid_control_t ;

/* @brief  ：创建一个pid 设备对象
 * @name   ：pid_control_create
 * @param  ：p, 比例系数
 * @param  ：i, 积分系数
 * @param  ：d, 微分系数
 * @param  ：ramp, 变化率限幅
 * @param  ：limit, 输出限复
 * @return ： 返回设备对象
 * @details：创建设备对象并初始化
 */
pid_control_t * pid_control_create(float p, float i, float d, float ramp, float limit);

/* @brief  ：销毁一个pid 设备对象
 * @name   ：pid_control_destory
 * @param  ：pid
 * @return ： 无
 * @details：无
 */
void pid_control_destory(pid_control_t *pid);

#endif /* SRC_MOTOR_PID_CONTROL_H_ */
